﻿using System;
using System.Collections.Generic;
using System.Text;


namespace Webcam_Filter
{
    class OudeFilmFilter : Filter
    {
        //ARGB

        protected override void runfilter(byte[] rgbValues, int hoogte, int breedte, string[] args)
        {

            int depth = 30;
            int dikteLijn = 3;
            int breedteARGB = breedte * 4;
            int totaalAantalPixels = hoogte * breedteARGB;

            System.Random RandNum = new System.Random();
            int aantalLijnen = RandNum.Next(2);
            System.Threading.Thread.Sleep(RandNum.Next(200));

            int A, B, G, R;

            //sepia maken...

            for (int i = 0; i < breedteARGB * hoogte; i += 4)
            {
                B = rgbValues[i];
                G = rgbValues[i + 1];
                R = rgbValues[i + 2];
                A = rgbValues[i + 3];

                R = (int)((0.299 * R) + (0.587 * G) + (0.114 * B));
                G = B = R;

                R += (depth * 2);
                if (R > 255)
                {
                    R = 255;
                }
                G += depth;
                if (G > 255)
                {
                    G = 255;
                }

                rgbValues[i] = (byte)B;
                rgbValues[i + 1] = (byte)G;
                rgbValues[i + 2] = (byte)R;
            }

                // blurren

            int blurSize = 2;

            int blurSizeARGB = blurSize * 4;

                    // voor elke lijn

            for (int h = 0; h < totaalAantalPixels; h += breedteARGB)
            {

                    // hele lijn afgaan in stapjes van 4

                for (int b = h; b < h + breedteARGB; b += 4)
                {
                    int gemR = 0, 
                        gemG = 0, 
                        gemB = 0;
                    int blurPixelCount = 0;


                    int hoogteVierkant = b + (blurSize * breedteARGB);
                    if (hoogteVierkant > hoogte * breedteARGB)
                        hoogteVierkant = hoogte * breedteARGB;

                    for (int hklein = b; hklein < hoogteVierkant; hklein += breedteARGB)
                    {
                        int breedteVierkant = hklein + blurSizeARGB;
                        if (breedteVierkant > totaalAantalPixels)
                            breedteVierkant = totaalAantalPixels;

                        for (int bklein = hklein; bklein < breedteVierkant; bklein += 4)
                        {
                            blurPixelCount++;
                            gemB += rgbValues[bklein];
                            gemG += rgbValues[bklein + 1];
                            gemR += rgbValues[bklein + 2];
                        }
                    }

                    gemB /= blurPixelCount;
                    gemG /= blurPixelCount;
                    gemR /= blurPixelCount;


                    for (int hklein = b; hklein < hoogteVierkant; hklein += breedteARGB)
                    {
                        int grensBytesBreedte = hklein + blurSizeARGB;
                        if (grensBytesBreedte > totaalAantalPixels)
                            grensBytesBreedte = totaalAantalPixels;

                        for (int bklein = hklein; bklein < grensBytesBreedte; bklein += 4)
                        {
                            rgbValues[bklein] = (byte)gemB;
                            rgbValues[bklein + 1] = (byte)gemG;
                            rgbValues[bklein + 2] = (byte)gemR;
                        }
                    }
                }
            }


            //lijnen plaatsen

            for (int i = 0; i < aantalLijnen; i++)
            {
                int beginPlaatsLijn = RandNum.Next(breedteARGB / 4) * 4;
                if (beginPlaatsLijn + dikteLijn * 4 > breedteARGB)
                    beginPlaatsLijn -= dikteLijn * 4;
                for (int plaatsLijn = beginPlaatsLijn; plaatsLijn < totaalAantalPixels; plaatsLijn += breedteARGB)
                {
                    rgbValues[plaatsLijn] = 255;
                    rgbValues[plaatsLijn + 1] = 255;
                    rgbValues[plaatsLijn + 2] = 255;
                    rgbValues[plaatsLijn + 4] = 255;
                    rgbValues[plaatsLijn + 5] = 255;
                    rgbValues[plaatsLijn + 6] = 255;
                }
            }

            // stippen

            System.Random RandNum2 = new System.Random();
            int plaatsStip = RandNum2.Next(breedteARGB / 4) * 4;
            int aantalKeerBreedteVoorStip = RandNum2.Next(hoogte - 6);

            // breedte stippen
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB)] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 1] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 1] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 2] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 2] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 3] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 3] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 4] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 4] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 5] = 255;
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 5] = 255;


            // hoogte stippen
            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 1) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 1) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 2) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 2) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 3) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 3) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 4) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 4) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 5) + breedteARGB] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 5) + breedteARGB] = 255;


            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 1) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 1) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 2) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 2) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 3) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 3) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 4) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 4) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 5) + breedteARGB * 2] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 5) + breedteARGB * 2] = 255;


            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 1) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 1) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 2) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 2) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 3) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 3) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 4) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 4) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 5) + breedteARGB * 3] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 5) + breedteARGB * 3] = 255;

            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 1) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 1) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 2) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 2) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 3) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 3) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 4) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 4) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 5) + breedteARGB * 4] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 5) + breedteARGB * 4] = 255;

            rgbValues[(plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 1) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 1) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 2) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 2) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 3) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 3) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 4) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 4) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) - 5) + breedteARGB * 5] = 255;
            rgbValues[((plaatsStip + aantalKeerBreedteVoorStip * breedteARGB) + 5) + breedteARGB * 5] = 255;

        }
    }
}